<html>
<head>
<title>22 正则表达式</title>
</head>
<body>
	<script type="text/javascript">
		/*
		* 正则表达式
		* 邮箱
		* 	- admin
			- admin@atguigu.com


		*	-	正则表达式用于定义一些字符串的规则
		*		计算机可以根据正则表达式，来检查一个字符串是否符合规则
		*		获取将字符串中符合规则的内容提取出来。	
		
		*/


		//创建正则表达式
		/*
		* 语法：
		* 	- 1. var 变量 = new RegExp("正则表达式","匹配模式"), 使用构造函数创建更加灵活;
		*	- 2. /a/i  使用字面量的方式创建更加简单；
		* 匹配模式：
		*	- i	执行对大小写不敏感的匹配。
		*	- g	执行全局匹配（查找所有匹配而非在找到第一个匹配后停止）。
		*	- m	执行多行匹配。
		*/

		//eg 1. 该正则表达式用来检测是否存在 a
		var reg = new RegExp("a","i");
		var reg = /a/i ;
		var str = "a";
		console.log(reg);
		console.log(typeof reg);

		/*
		* 正则表达的方法：
		* test()
		*	- 使用这个方法可以用来检查一个字符串是否符合正则表达式的规则，如果符合则返回true，否则返回false
		*/

		var result = reg.test(str);
		console.log(result);



		//eg 2. 创建一个正则表达式，检查一个字符串中是否有a或b
		/*
		* 使用 ｜ 表示 或者 的意思
		*/
		reg = /a｜b/;

		//eg3. 检查一个字符串中是否有字母

		/*
		* [] 里的内容也是 或 的关系
		* [ab] == a|b
		* [a-z] 任意的小写字母
		* [A-z] 任意字母
		*
		*/
		

		//eg4. 检查一个字符串中是否含有 abc 或 adc 或 aec

		reg = /abc|adc|aec/;
		reg = /a[bde]c/;

		/*
		* [^ ] 除了
		*/

		//eg5. 除了ab 的其他字母
		reg = /[^ab]/;




		// 字符串和正则相关的方法

		/*
		* split()
		*	- 可以将一个字符串拆分为一个数组
		*	- 方法中可以传递一个正则表达式作为参数，这样方法将会根据正则表达式去拆分字符串
		*	- 即使不指定全局匹配，也会全部拆分
		*/

		var str = "1a2b3c4d5e6f";

		//根据任意字母来将字符串拆分
		var result = str.split(/[A-z]/);
		console.log("split = "+ result+" ; result[0] =" + result[0]);


		/*
		* search()
		* 	- 可以搜索字符串中是否有指定内容
		*	- 如果搜索到指定内容，则会返回第一次出现的索引，如果没有搜索到返回 -1
		*	- 它可以接受一个正则表达式作为参数，然后会根据正则表达式去检索字符串
		*
		*/

		str = "hello abc hello aec afc";

		//搜索字符串中是否含有 abc aec  afc
		result = str.search(/a[bef]c/);
		console.log("result = "+ result);


		/*
		* match()
		*	- 可以根据正则表达式，从一个字符串中将符合条件的内容提取出来
		*	- 默认情况下我们的match只会找到第一个符合要求的内容，找到以后就停止检索
		*		我们可以设置正则表达式为全局匹配模式，这样就会匹配到所有的内容
		*		可以为一个正则表达式设置多个匹配模式，且顺序无所谓
		*
		*	- match()会将匹配到的内容封装到一个数组中返回，即使只查询到一个结果
		*/

		str = "1a2a3a4a5e6f7A8B9C";
		result = str.match(/[a-z]/ig);
		console.log("match = "+result+" ;result[0] ="+result[0]);


		/*
		*	replace()
		*	- 可以将字符串中指定内容替换为新的内容
		*	- 参数：
		*		1. 被替换的内容，可以接受一个正则表达式作为参数
		*		2. 新的内容
		*	- 默认只会替换第一个
		*/

		result = str.replace(/[a-z]/gi,"");
		console.log("replace = "+result );



		/*
		* 量词
		*	- 通过量词可以设置一个内容出现的次数
		*	- 量词只对它前边的内容起作用
		* 	- {n} 正好出现n次
		*	- {m,n} 出现 m-n 次
		*	- {m,} 出现m次以上
		*	- + 至少一个，相当于{1,}
		* 	- * 0个或多个，相当于{0,}
		*	- ? 0个或1个，相当于{0,1}
		*/

		var reg = /a{3}/;
		//ab 出现3次
		var reg = /(ab){3}/;
		//b 出现 1到3次
		var reg = /ab{1,3}c/;
		var reg = /ab{1,}c/;
		console.log(reg.test("aaabbc"));


		/*
		* 检查一个字符串中是否以a开头
		*	^ 表示开头
		*	$ 表示结尾
		*/

		//匹配开头的a
		reg  = /^a/;
		//匹配结尾的a
		reg = /a$/;
		//如果在正则表达式中同时使用^ $ 则要求字符串必须完全符合正则表达式
		reg = /^a$/

		console.log(reg.test("aaa"));

		/*
		* 创建一个正则表达式，用来检查一个字符串是否是一个合法的手机号码
	
		*	- 以 1 开头
		*	- 第二位 3-9 任意数字
		*	- 3 位 以后任意数字 9个
		*/


		var phone = "13590490300";

		var reg = /^1[3-9][0-9]{9}$/;
		console.log(phone + " 测试手机号码 ："+reg.test(phone));


		/*
		* 检查一个字符串中是否含有 .
		*	.表示任意字符
		* 在正则表达式中使用 \ 作为转义字符
		* \. 来表示 .
		* \\ 表示 \
		*
		* 注意: 使用构造函数时，由于它的参数是一个字符串，而 \ 是字符串中转义字符，
		* 如果要使用 \ 则需要使用 \\ 来代替
		*/

		//\. 来表示 .
		var reg = /\./;

		//\\ 表示 \
		var reg = /\\/;

		//注意: 使用构造函数时，由于它的参数是一个字符串，而 \ 是字符串中转义字符，
		reg = new RegExp("\\.");

		console.log("检查一个字符串中是否含有 . : "+reg.test("test.log"));


		/*
		*	\w	查找数字、字母及下划线。[A-z0-9_]
		*	\W	查找非单词字符。 [^A-z0-9_]
		*	\d	查找数字。[0-9]
		*	\D	查找非数字字符。[^0-9]
		*	\s	查找空白字符。
		*	\S	查找非空白字符。
		*	\b	匹配单词边界。
		*	\B	匹配非单词边界。
		*/

		//检查一个字符串中是否含有单词 child
		reg = /\bchild\b/;

		console.log("匹配单词边界 = "+reg.test("hello children"));
		console.log("匹配单词边界 = "+reg.test("hello child  ren"));
		
		//接受一个用户的输入
		//var str = prompt("请输入你的用户名 : ");
		console.log(str);
		str = str.replace(/\s/g,"");
		console.log(str);

		//去除掉字符串中前后的空格
		//去掉空格就是使用“”来替换空格

		str = "  hello world  ";
		//去除开头的空格
		reg = /^\s*/;
		str =  str.replace(reg,"");
		console.log(" 去除开头的空格 = "+ str );
		//去除结尾的空格
		str = "  hello world  ";
		reg = /\s*$/;
		str =  str.replace(reg,"");
		console.log(" 去除结尾的空格 = "+ str );

		// /^\s*|\s*$/g 匹配开头和结尾的空格
		str = "  hello world  ";
		reg = /^\s*|\s*$/g
		str =  str.replace(reg,"");
		console.log(" 匹配开头和结尾的空格 = "+ str );



		/*
		* 邮箱
		* 	- admin
			- admin@atguigu.com
			1. 任意字母数字下划线 (3位+). 任意字母数字下划线  = w{3,} (\.\w+)* @   
			2. @
			3. 任意字母数字 [A-z0-9] = [A-z0-9]+
			4. . [任意字母](2位+) [a-z]{2,} = \.[A-z]{2,}
		*
		*/

		mail_reg  = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,}){1,2}$/;
		var mail = "daidai.zou@dfrobot.com";
		console.log("邮件 "+mail+ "  = "+ mail_reg.test(mail) )

	</script>
</body>


</html>